<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
use \Illuminate\Support\Facades\Session;

class LoginController extends Controller
{
    public function login(Request $request)
    {
        try {
            // 验证请求数据  
            $request->validate(
                [
                    'accountType' => 'required|in:name,email',
                    'account' => 'required|string',
                    'password' => 'required|string',
                    'userType' => 'required|in:normalUser,admin',
                ],
                [
                    'accountType.required' => '账号类型不能为空。',
                    'accountType.in' => '无效的账号类型。',
                    'account.required' => '账号不能为空。',
                    'password.required' => '密码不能为空。',
                    'userType.required' => '用户类型不能为空。',
                    'userType.in' => '无效的用户类型。',
                ]
            );
            // 从请求中获取账号类型和账号  
            $accountType = $request->input('accountType');
            $account = $request->input('account');
            $password = $request->input('password');
            $userTypeInput = $request->input('userType');

            // 转换userType的值  
            $userType = ($userTypeInput === 'normalUser') ? 'U' : 'S'; // 这里进行转换  
            // 根据账号类型构建凭据数组  
            $credentials = [];
            if ($accountType === 'name') {
                $credentials = ['name' => $account, 'password' => $password, 'user_type' => $userType];
            } elseif ($accountType === 'email') {
                $credentials = ['email' => $account, 'password' => $password, 'user_type' => $userType];
            }


            if (Auth::attempt($credentials)) {
                // 登录成功，获取当前用户  
                $user = Auth::user();
                // 检查user_state字段  
                if ($user->user_state === 'OFF') {
                    // 用户账户已注销，注销用户并返回错误信息  
                    Auth::logout();
                    return response()->json([
                        'message' => '账号已注销。',
                        'errors' => ['account' => ['账号已注销。']],
                    ], 403); // 使用403 Forbidden状态码表示用户没有权限访问  
                }
                // 登录成功，执行其他逻辑
                // 生成session token
                $token = Session::token();
                // 返回成功响应  
                // 例如：  
                // return response()->json(['user' => $user, 'token' => $token]);
                return response()->json([
                    'message' => '登录成功,下面马上为您自动跳转',
                    'user' => $user, // 你可以根据需要调整返回的用户信息  
                    'token' => $token, // 如果生成了令牌，可以返回给前端  
                ], 200); // 使用200 OK状态码表示登录成功
            } else {
                // 登录失败，返回错误信息  
                return response()->json([
                    'message' => '登录失败，请检查您的凭据。',
                    'errors' => ['account' => ['账号、密码或类型错误。']],
                ], 401); // 使用401 Unauthorized状态码表示未经授权  
            }
        } catch (\Exception $e) {
            // 异常处理  
            if (config('app.debug')) {
                // 如果是开发环境，返回详细的错误信息  
                return response()->json([
                    'message' => '系统错误，请稍后再试。',
                    'errors' => [
                        'system' => [
                            'message' => $e->getMessage(), // 具体的错误消息  
                            'file' => $e->getFile(), // 错误发生的文件  
                            'line' => $e->getLine(), // 错误发生的行号  
                            'trace' => explode("\n", $e->getTraceAsString()), // 完整的堆栈跟踪，可能需要进一步处理以避免暴露过多信息  
                        ],
                    ],
                ], 500); // 使用500 Internal Server Error状态码表示服务器内部错误  
            } else {
                // 如果是生产环境，只返回一般的错误信息  
                return response()->json([
                    'message' => '系统错误，请稍后再试。',
                    // 你可以在这里选择不返回具体的错误信息，或者只返回部分信息  
                    'errors' => ['system' => ['message' => '内部服务器错误']],
                ], 500); // 使用500 Internal Server Error状态码表示服务器内部错误  
            }

            // 如果你想记录错误日志，可以在这里添加日志记录代码  
            // \Log::error('Login error: ' . $e->getMessage()); // 记录错误日志  
        }
    }


    public function login1(Request $request)
    {
        // 验证请求数据  
        $request->validate(
            [
                'accountType' => 'required|in:name,email',
                'account' => 'required|string',
                'password' => 'required|string',
                'userType' => 'required|in:normalUser,admin',
            ],
            [
                'accountType.required' => '账号类型不能为空。',
                'accountType.in' => '无效的账号类型。',
                'account.required' => '账号不能为空。',
                'password.required' => '密码不能为空。',
                'userType.required' => '用户类型不能为空。',
                'userType.in' => '无效的用户类型。',
            ]
        );
        // 从请求中获取账号类型和账号  
        $accountType = $request->input('accountType');
        $account = $request->input('account');
        $password = $request->input('password');
        $userTypeInput = $request->input('userType');

        // 转换userType的值  
        $userType = ($userTypeInput === 'normalUser') ? 'U' : 'S'; // 这里进行转换  
        // 根据账号类型构建凭据数组  
        $credentials = [];
        if ($accountType === 'name') {
            $credentials = ['name' => $account, 'password' => $password, 'user_type' => $userType];
        } elseif ($accountType === 'email') {
            $credentials = ['email' => $account, 'password' => $password, 'user_type' => $userType];
        }


        if (Auth::attempt($credentials)) {
            // 登录成功，获取当前用户  
            $user = Auth::user();
            // 检查user_state字段  
            if ($user->user_state === 'OFF') {
                // 用户账户已注销，注销用户并返回错误信息  
                Auth::logout();
                return response()->json([
                    'message' => '账号已注销。',
                    'errors' => ['account' => ['账号已注销。']],
                ], 403); // 使用403 Forbidden状态码表示用户没有权限访问  
            }
            // 登录成功，执行其他逻辑
            // 生成session token
            $token = Session::token();
            // 返回成功响应  
            // 例如：  
            // return response()->json(['user' => $user, 'token' => $token]);
            return response()->json([
                'message' => '登录成功,下面马上为您自动跳转',
                'user' => $user, // 你可以根据需要调整返回的用户信息  
                'token' => $token, // 如果生成了令牌，可以返回给前端  
            ], 200); // 使用200 OK状态码表示登录成功
        } else {
            // 登录失败，返回错误信息  
            return response()->json([
                'message' => '登录失败，请检查您的凭据。',
                'errors' => ['account' => ['账号、密码或类型错误。']],
            ], 401); // 使用401 Unauthorized状态码表示未经授权  
        }
    }


    public function logout()
    {
        try {
            Auth::logout();
            // 可以选择性地清除 session 数据  
            // Session::flush();  
            // 或者使用 Laravel 提供的辅助函数  
            // request()->session()->flush();  
            // 返回成功的 JSON 响应  
            return response()->json(['message' => '已成功注销。'], 200);
        } catch (\Exception $e) {
            // 捕获异常并返回失败的 JSON 响应  
            // 注意：在实际应用中，通常不会在这里捕获 Auth::logout() 抛出的异常  
            // 因为 Auth::logout() 很少会抛出异常  
            return response()->json(['message' => '注销过程中发生错误。', 'error' => $e->getMessage()], 500);
        }
    }
}
